/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package documentadorrepositorio.repositorio;

import documentadorrepositorio.artefatos.Artefato;
import documentadorrepositorio.artefatos.ComparadorArtefato;
import documentadorrepositorio.artefatos.ComparadorNomeArquivo;
import documentadorrepositorio.descritoresArtefatos.DescritorArtefato;
import documentadorrepositorio.descritoresArtefatos.DescritorUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 *
 * @author André
 */
public class AnalisadorRepositorio {

    IGerenciadorRepositorio gerenciador = null;
    
    Map<DescritorArtefato, String> pastaArtefatos = null;
    Map<DescritorArtefato, List<String>> arquivosArtefatos = null;
    Map<DescritorArtefato, List<Artefato>> artefatos = null;
         

    public AnalisadorRepositorio(IGerenciadorRepositorio gerenciadorRepositorio) {
        gerenciador = gerenciadorRepositorio;
    }

    public List<Artefato> AnalisaRepositorio() throws IOException, Exception {
        return AnalisaRepositorio("");
    }

    public List<Artefato> AnalisaRepositorio(String caminho) throws IOException, Exception {
        obtemPastas(caminho);
        obtemArquivos(caminho);

        return null;
    }

    private Artefato obtemArtefato(List<Artefato> lis, Artefato art) {
        for (Artefato artefato : lis) {
            if (art.getNumeroArtefato().equals(artefato.getNumeroArtefato()) && art.getTipo().equals(artefato.getTipo())) {
                return artefato;
            }
        }
        return null;
    }

    private void obtemArquivos(String caminho) throws IOException,  Exception {
        arquivosArtefatos = new HashMap<>();
        artefatos = new HashMap<>();
        for (Map.Entry<DescritorArtefato, String> item : this.pastaArtefatos.entrySet()) {
            List<String> arquivos = new ArrayList<>();
            List<Artefato> lstArtefatos = new ArrayList<>();
            Artefato artefato = null;
            List<String> li = gerenciador.obtemArquivos((caminho.isEmpty() ? "" : caminho + "/") + item.getValue());
            Collections.sort(li, new ComparadorNomeArquivo());
            for (String arquivo : li) {
                if (item.getKey().nomeArquivoAtendeAoPadrao(arquivo)) {
                    arquivos.add(arquivo);
                    artefato = item.getKey().obtemDadosArtefato(arquivo);
                    Artefato pai = obtemArtefato(lstArtefatos, artefato);
                    if (isImage(arquivo)) {
                        artefato.setImagem(true);
                    } else {
                        artefato.setImagem(false);
                    }
                    if (pai != null) {
                        pai.getArtefatos().add(artefato);
                    } else {
                        lstArtefatos.add(artefato);
                    }
                    ArquivoVersionado arquivoVersionado = gerenciador.obtemDadosArquivo((caminho.isEmpty() ? "" : caminho + "/") + item.getValue() + "/" + arquivo);
                    //SVNProperties propriedadesArquivo = arquivoVersionado.getPropriedadesArquivo();
//                    artefato.setDataCommit(SVNDate.parseDate(propriedadesArquivo.getStringValue(SVNProperty.COMMITTED_DATE)));
                    artefato.setDataCommit(arquivoVersionado.getDataCommit());
                    //artefato.setReview(Integer.parseInt(propriedadesArquivo.getStringValue(SVNProperty.REVISION)));
                    artefato.setReview(arquivoVersionado.getRevisao());
                    artefato.setBytesArtefato(arquivoVersionado.getBytesArquivo());
                }
            }

            arquivosArtefatos.put(item.getKey(), arquivos);
            Collections.sort(lstArtefatos, new ComparadorArtefato());
            artefatos.put(item.getKey(), lstArtefatos);
        }
    }

    private void obtemPastas(String caminho) throws IOException, Exception {
        pastaArtefatos = new HashMap<>();
        for (String pasta : gerenciador.obtemPastas(caminho)) {
            for (DescritorArtefato descritor : DescritorUtil.obtemDescritores()) {
                if (descritor.nomePastaAtendeAoPadrao(pasta)) {
                    pastaArtefatos.put(descritor, pasta);
                }
            }
        }
    }

    public Map<DescritorArtefato, List<String>> getArquivosArtefatos() {
        return arquivosArtefatos;
    }

    public Map<DescritorArtefato, List<Artefato>> getArtefatos() {
        return artefatos;
    }

    public Map<DescritorArtefato, String> getPastaArtefatos() {
        return pastaArtefatos;
    }

    private boolean isImage(String arquivo) {
        if (arquivo.toLowerCase().endsWith(".jpg") || arquivo.toLowerCase().endsWith(".jpeg")) {
            return true;
        } else {
            return false;
        }
    }
}
